package com.itbaizhan.dao.impl;

import com.itbaizhan.dao.RedisDao;
import com.itbaizhan.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author spf
 * @date 2024/3/8
 * @time 8:46
 */
@Repository
public class RedisDaoImpl implements RedisDao {

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public Item get(String key) {
        return (Item) redisTemplate.opsForValue().get(key);
    }

    /**
     * 当前方法为原子操作。要再更新之前，先查询一下key值对应的商品，
     * 是否可以预定，如果可以就更新，否则忽略本次操作
     * @param key
     * @param value
     * @return
     */
    @Override
    public boolean set(String key, Object value) {
        try{
            // 开启事务支持
            redisTemplate.setEnableTransactionSupport(true);
            // 执行多次操作，且操作是原子性操作的时候，可以通过回调逻辑，实现。
            Object execute = redisTemplate.execute(new SessionCallback<List<Object>>() {
                @Override
                public List<Object> execute(RedisOperations operations) throws DataAccessException {
                    Item item = (Item) operations.opsForValue().get(key);
                    if (item != null && item.getIsRented()) {
                        return null;
                    }
                    operations.multi();
                    operations.opsForValue().set(key, value);
                    return operations.exec();
                }
            });

//        Object execute = redisTemplate.execute((SessionCallback<List<Object>>) operations -> {
//            Item item = (Item) operations.opsForValue().get(key);
//            if (item != null && item.getIsRented()) {
//                return null;
//            }
//            operations.multi();
//            operations.opsForValue().set(key, value);
//            return operations.exec();
//        });

            redisTemplate.setEnableTransactionSupport(false);
            if (null == execute){
                return false;
            }
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}
